﻿using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Configuracion
{
    public class dbo_Sec_Usuario
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion

        #region Constructores

        public dbo_Sec_Usuario(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        public dbo_Sec_Usuario()
        {
        }

        #endregion

        #region INSERT

        public Respuesta Insert_Sec_Usuario(

            string UserName,
            string Password,
            string Nombre,
            string Telefono,
       
            bool IsActive,
            string Email,
            string Puesto,
            int Id_Pais,
            int Id_Estado,
            int Id_ComoNosConociste,
            bool IsPagado
        )
        {
            try
            {
                string Query = @"INSERT INTO dbo_Sec_Usuario
                             (
	                            Id_Usuario,
	                            UserName,
	                            Residencia,
	                            Nombre,
	                            Telefono,
	                          
	                            IsActive,
	                            Email,
	                            Puesto,
	                            Num_Intentos,
	                            Mac_Address,
	                            Last_Time,
	                            Fecha_Alta,
	                            Id_Pais,
	                            Id_Estado,
	                            Id_ComoNosConociste,
	                            IsPagado
                             )
                             VALUES
                             (
                                IIF(DCount('*', 'dbo_Sec_Usuario') = 0, 1, DMax('Id_Usuario', 'dbo_Sec_Usuario') + 1),
                                '@@UserName',
	                            '@@Residencia',
	                            '@@Nombre',
	                            '@@Telefono',
	                     
	                            @@IsActive,
	                            '@@Email',
	                            '@@Puesto',
	                            0,
	                            '',
	                            NOW(),
	                            NOW(),
	                            @@Id_Pais,
	                            @@Id_Estado,
	                            @@Id_ComoNosConociste,
	                            @@IsPagado
                             )";

                Query = Query.Replace("@@UserName", UserName.Replace("'", "''"));
                Query = Query.Replace("@@Residencia", CypherClass.CifrarTexto(Password));
                Query = Query.Replace("@@Nombre", Nombre.Replace("'", "''"));
                Query = Query.Replace("@@Telefono", Telefono);
              
                if (IsActive)
                    Query = Query.Replace("@@IsActive", "1");
                else
                    Query = Query.Replace("@@IsActive", "0");

                if (IsPagado)
                    Query = Query.Replace("@@IsPagado", "1");
                else
                    Query = Query.Replace("@@IsPagado", "0");

                Query = Query.Replace("@@Email", Email);
                Query = Query.Replace("@@Puesto", Puesto.Replace("'", "''"));
                Query = Query.Replace("@@Id_Pais", Id_Pais.ToString());
                Query = Query.Replace("@@Id_Estado", Id_Estado.ToString());
                Query = Query.Replace("@@Id_ComoNosConociste", Id_ComoNosConociste.ToString());

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }


        #endregion

        #region UPDATE

        public Respuesta Update_Usuario_Num_Intentos(
            object Id,
            int Num_Intentos
        )
        {
            try
            {
                string Query = @"UPDATE dbo_Sec_Usuario SET
                                                                 
                                    Last_Time = NOW(),
                                    Num_Intentos = @@Num_Intentos
                                    
                                 WHERE Id_Usuario = @@Id";

                Query = Query.Replace("@@Id", Id.ToString());
                Query = Query.Replace("@@Num_Intentos", Num_Intentos.ToString());

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Update_Usuario_Datos(
            object Id,
            string Nombre,
            string Telefono,
            string Email,
            string Puesto,
            int Pais,
            int Estado,
            bool IsActive
        )
        {
            try
            {
                string Query = @"UPDATE dbo_Sec_Usuario SET
                                                                 
                                    Nombre = @Nombre,
                                    Telefono = @Telefono,
                                    Email = @Email,
                                    Puesto = @Puesto,
                                    Id_Pais = @Pais,
                                    Id_Estado = @Estado,
                                    IsActive = @IsActive
                                    
                                 WHERE Id_Usuario = @Id";

                OleDbCommand command = new OleDbCommand(Query);
                command.Parameters.AddWithValue("@Nombre", Nombre);
                command.Parameters.AddWithValue("@Telefono", Telefono);
                command.Parameters.AddWithValue("@Email", Email);
                command.Parameters.AddWithValue("@Puesto", Puesto.Replace("'", "''"));
                command.Parameters.AddWithValue("@Id_Pais", Pais);
                command.Parameters.AddWithValue("@Id_Estado", Estado);

                command.Parameters.AddWithValue("@IsActive", IsActive);

                command.Parameters.AddWithValue("@Id", ((Int32)Id).ToString());

                return SrvDB.ExecuteQuery_Insert(command);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public static Respuesta Update_Usuario_InfoGral(
            object Id,
            int Id_Pais,
            int Id_Estado,
            string Nombre = "",
            string Telefono = ""
        )
        {
            try
            {
                string Query = @"UPDATE dbo_Sec_Usuario SET
                                                                 
                                    Id_Pais = @@Id_Pais,
                                    Id_Estado = @@Id_Estado,
                                    Nombre = '@@Nombre',
                                    Telefono = '@@Telefono'
                                    
                                 WHERE Id_Usuario = @@Id";

                Query = Query.Replace("@@Id_Pais", Id_Pais.ToString());
                Query = Query.Replace("@@Id_Estado", Id_Estado.ToString());
                Query = Query.Replace("@@Id", ((Int32)Id).ToString());
                Query = Query.Replace("@@Nombre", Nombre.Replace("'", "''"));
                Query = Query.Replace("@@Telefono", Telefono);

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public static Respuesta Update_Usuario_NuevaContrasena(object Id,
                                                               string Contrasena)
        {
            try
            {
                string Query = @"UPDATE dbo_Sec_Usuario SET Residencia = '@@Contrasena' WHERE Id_Usuario = @@Id;";
                Query = Query.Replace("@@Id", ((Int32)Id).ToString());
                Query = Query.Replace("@@Contrasena", CypherClass.CifrarTexto(Contrasena));

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public static Respuesta Update_LicenciaToAdmin(int Id)
        {
            DataTable dt_UserAdmin = dbo_Sec_Usuario.Get_Usuario_Por_UserName("admin");

            string Query = @"UPDATE
                                 dbo_Sec_Usuario SET Genero = @Licencia
                             WHERE 
                                 Id_Usuario = @Id";

            OleDbCommand command = new OleDbCommand(Query);
            command.Parameters.AddWithValue("@Licencia", CypherClass.CifrarTexto(DateTime.Parse(dt_UserAdmin.Rows[0]["Genero"].ToString()).ToString()));
            command.Parameters.AddWithValue("@Id", Id);

            return SrvDB.ExecuteQuery_Update(command);
        }

     

        public  Respuesta Update_Usuario_MACAddress(int IdUsuario, string MacAddres)
        {
            try
            {
                string Query = @"UPDATE
                                 dbo_Sec_Usuario SET Mac_Address = '@MacAddres'
                             WHERE 
                                 Id_Usuario = @IdUsuario";

                Query = Query.Replace("@IdUsuario", IdUsuario.ToString());

                Query = Query.Replace("@MacAddres", MacAddres.ToString());
                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }



        }

        #endregion

        #region SELECT

        /// <summary>
        /// 
        /// </summary>
        /// <param name="Nombre">Nombre de Usuario que se ingresa en el Login.</param>
        /// <returns>Devuelve -1 en caso de ocurrir un error, cualquier otro número corresponde al Id del Usuario.</returns>

        public  string Get_MACAddress()
        {
            string mac = "";
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {

                if (nic.OperationalStatus == OperationalStatus.Up && (!nic.Description.Contains("Virtual") && !nic.Description.Contains("Pseudo")))
                {
                    if (nic.GetPhysicalAddress().ToString() != "")
                    {
                        mac = nic.GetPhysicalAddress().ToString();
                    }
                }
            }
            return mac;
        }
  
                public int Get_Id_Usuario(string Nombre)
        {
            try
            {
                string Query = "SELECT Id_Usuario FROM dbo_Sec_Usuario WHERE UserName = '@@Nombre'";
                Query = Query.Replace("@@Nombre", Nombre);

                return Int32.Parse(SrvDB.ExecuteQuery_Get(Query).Rows[0]["Id_Usuario"].ToString());
            }
            catch (Exception)
            {
                return -1;
            }
        }

        public static DataTable Get_Users_Licencia()
        {
            string Query = "SELECT * FROM dbo_Sec_Usuario WHERE IsActive";

            return SrvDB.ExecuteQuery_Get(Query);
        }
        public static DataTable Get_Users_Licencia_By_Id(int Id_Usuario)
        {
            string Query = "SELECT * FROM dbo_Sec_Usuario WHERE IsActive and Id_Usuario = @Id_Usuario";
            Query = Query.Replace("@Id_Usuario", Id_Usuario.ToString());


            return SrvDB.ExecuteQuery_Get(Query);
        }
        public string Get_UserName(int Id)
        {
            try
            {
                string Query = @"SELECT 

                                    A1.*,
								    A2.Nombre AS Desc_Pais,
								    A3.Nombre AS Desc_Estado

                                FROM ((dbo_Sec_Usuario AS A1
                            
                                    INNER JOIN dbo_Cat_SIIE_Pais       AS A2 ON A1.Id_Pais = A2.Id_SIIE_Pais)
                                    INNER JOIN dbo_Cat_SIIE_Estado       AS A3 ON A1.Id_Estado = A3.Id_SIIE_Estado)

                                WHERE A1.Id_Usuario = @@Id";
                Query = Query.Replace("@@Id", Id.ToString());

                return SrvDB.ExecuteQuery_Get(Query).Rows[0]["UserName"].ToString();
            }
            catch (Exception)
            {
                return null;
            }
        }

        public DataTable Get_Usuarios()
        {
            string Query = @"SELECT 

                                    A1.*,
								    A2.Nombre AS Desc_Pais,
								    A3.Nombre AS Desc_Estado

                                FROM ((dbo_Sec_Usuario AS A1
                            
                                    INNER JOIN dbo_Cat_SIIE_Pais       AS A2 ON A1.Id_Pais = A2.Id_SIIE_Pais)
                                    INNER JOIN dbo_Cat_SIIE_Estado       AS A3 ON A1.Id_Estado = A3.Id_SIIE_Estado)
                                ";

            return SrvDB.ExecuteQuery_Get(Query);
        }

        public static DataTable Get_Usuario_Por_Id(object Id)
        {
            string Query = @"SELECT 

                                    A1.*,
								    A2.Nombre AS Desc_Pais,
								    A3.Nombre AS Desc_Estado

                                FROM ((dbo_Sec_Usuario AS A1
                            
                                    INNER JOIN dbo_Cat_SIIE_Pais       AS A2 ON A1.Id_Pais = A2.Id_SIIE_Pais)
                                    INNER JOIN dbo_Cat_SIIE_Estado       AS A3 ON A1.Id_Estado = A3.Id_SIIE_Estado)

                                WHERE A1.Id_Usuario = @@Id";
            Query = Query.Replace("@@Id", ((Int32)Id).ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }

        public static DataTable Get_Usuario_Por_UserName(string UserName)
        {
            string Query = @"SELECT 
                                    A1.*,
								    A2.Nombre AS Desc_Pais,
								    A3.Nombre AS Desc_Estado
                                FROM ((dbo_Sec_Usuario AS A1
                                    INNER JOIN dbo_Cat_SIIE_Pais       AS A2 ON A1.Id_Pais = A2.Id_SIIE_Pais)
                                    INNER JOIN dbo_Cat_SIIE_Estado       AS A3 ON A1.Id_Estado = A3.Id_SIIE_Estado)
                                WHERE A1.UserName  = '@@UserName'";
            Query = Query.Replace("@@UserName", UserName.Replace("'", "''"));
            return SrvDB.ExecuteQuery_Get(Query);
        }

        #endregion
    }

}
